iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
Modern Web

React 測試 x AI:探索測試新境界,測試不再枯燥乏味!系列 第 5

[Day 05] React 測試安裝介紹 ( CRA / Vite / Next.js )

  • 分享至 

  • xImage
  •  

前幾篇介紹完 JavaScript 的測試框架,今天要來介紹 React 測試安裝。我會以目前最常用的 React 開發工具 CRAViteNext.js 來介紹。

React 測試套件

React 測試套件有很多種,像是 EnzymeTesting LibraryReact Hooks Testing Library 等等,這邊我使用 React 官方推薦的 Testing Library。

React 開發工具

📌 CRA

雖然在新的官網推薦中,已經把 CRA 拿掉,不過一些舊專案可能還是會使用 CRA 來開發。

安裝:

npx create-react-app my-app

CRA 有個很大優點就是內建就有含 Jest 及常用的 React-testing-library,所以不用再額外安裝。

如果要使用 TypeScript 的話,可以在安裝時加上 --template typescript

npx create-react-app my-app --template typescript

就會把 TypeScript 需要的測試套件都安裝進去。

📌 Vite

Vite 是 2021 推出的開發工具,它的特色是快速的開發速度,官方推薦的測試框架是 Vitest,Vitest 的安裝方式可以參考官方文件。這邊我就還是以安裝 Jest 為例。

安裝 Vite:

npm create vite@latest

JavaScript

安裝 Jest 及 React-testing-library:

npm i -D  jest @testing-library/react @testing-library/jest-dom @testing-library/user-event

在 package.json 加入 script

{
  "scripts": {
    "test": "jest"
  }
}

前面有提到因為如果要使用 ESModule 的 import/export 語法,需要額外安裝 @babel/preset-envbabel-jest,詳細可參考官方文件

npm install -D @babel/preset-env babel-jest

而在 React 專案還需要安裝 @babel/preset-react

npm install -D @babel/preset-react

安裝完後,建立 babel.config.json 或 .babelrc,並把安裝完的套件加到 presets,在 React 17 之後的記得要加上 runtime。

{
  "presets": [
    "@babel/preset-env",
    ["@babel/preset-react", { "runtime": "automatic" }]
  ]
}

在 React 要支援 svg 及 css 等格式的檔案,會被當作 js 檔編譯,所以需要額外安裝 jest-svg-transformeridentity-obj-proxy

npm i -D jest-svg-transformer identity-obj-proxy

並在 package.json 中加入以下設定:

{
  "jest": {
    "transform": {
      "^.+\\.(js|jsx|ts|tsx)$": "babel-jest"
    },
    "moduleNameMapper": {
      "\\.(svg)$": "jest-svg-transformer",
      "\\.(css|less|scss|sass)$": "identity-obj-proxy"
    }
  }
}

再來需要安裝 jest-environment-jsdom 讓 Jest 在測試時使用 jsdom 來模擬瀏覽器環境,這樣就可以在測試時使用 DOM API。

npm i -D jest-environment-jsdom

最後如果要使用 @testing-library/jest-dom 的擴充語法,需要先建立一個 setupTests.js 檔案,並在裡面加入以下程式碼:

import "@testing-library/jest-dom";

接著在 package.json 中加入以下設定:

{
  "jest": {
    "setupFilesAfterEnv": ["<rootDir>/setupTests.js"]
  }
}

就可以在 Vite 跑 React 測試了!!

*ESLint 設定

如果使用 Vite 內建的 ESLint 測試檔案會一直報紅字,不過是可以跑測試的,只是看起來很不舒服,解決方式是在 .eslintrc.js 中開啟 jest 環境:

module.exports = {
  env: {
    jest: true,
  },
};

TypeScript

使用 TypeScript 的話,步驟都與 JavaScript 流程相同,只是需要額外安裝 @types/jest@babel/preset-typescript

npm i -D @types/jest @babel/preset-typescript

在 .babel.config.json 裡加入 typeScript 設定

{
  "presets": [
    "@babel/preset-env",
    ["@babel/preset-react", { "runtime": "automatic" }],
    "@babel/preset-typescript"
  ]
}

然後使用 @testing-library/jest-dom 的擴充語法,需要把 setupTests.js 改成 setupTests.ts,然後在 tsconfig.json 中引入:

{
  "compilerOptions": {
    ..., // 其他設定
    "include": ["src/setupTests.ts"]
  }
}

這樣就可以跑 TypeScript 的測試了!

📌 Next.js

JavaScript

npx create-next-app@latest

安裝 Jest、React-testing-library 及 jest-environment-jsdom:

npm i -D  jest @testing-library/react @testing-library/jest-dom @testing-library/user-event jest-environment-jsdom

在 package.json 加入 script

{
  "scripts": {
    "test": "jest"
  },
  "jest": {
    "testEnvironment": "jsdom",
    "setupFilesAfterEnv": ["<rootDir>/setupTests.js"]
  }
}

建立 setupTests.js

import "@testing-library/jest-dom";

如果遇到 Parsing error : Cannot find module 'next/babel' 需要在 .eslintrc.js 中加入 next/babel

{
  "extends": ["next/babel", "next/core-web-vitals"]
}

另外在 next.js 不用安裝 babel,只要在 .babelrc 中加入 next/babel 就可以了。

{
  "presets": ["next/babel"]
}

TypeScript

只要額外安裝 @types/jest

npm i -D @types/jest

Next.js Jest 設定也可以參考 Setting up Jest (with the Rust Compiler)


今天的程式碼都放有在 GitHub,有興趣的可以下載來玩,下一篇來介紹 React Testing Library 的語法~

參考資料


上一篇
[Day 04] Jest 進階模擬語法
下一篇
[Day 06] React Testing Library 語法介紹
系列文
React 測試 x AI:探索測試新境界,測試不再枯燥乏味!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言